/**
 * request 网络请求工具
 * 更详细的api文档: https://bigfish.alipay.com/doc/api#request
 */
import { extend } from 'umi-request';
import { Notification, Loading } from 'element-ui';

const codeMessage = {
	200: '服务器成功返回请求的数据。',
	201: '新建或修改数据成功。',
	202: '一个请求已经进入后台排队（异步任务）。',
	204: '删除数据成功。',
	400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
	401: '用户没有权限（令牌、用户名、密码错误）。',
	403: '用户得到授权，但是访问是被禁止的。',
	404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
	406: '请求的格式不可得。',
	410: '请求的资源被永久删除，且不会再得到的。',
	422: '当创建一个对象时，发生一个验证错误。',
	500: '服务器发生错误，请检查服务器。',
	502: '网关错误。',
	503: '服务不可用，服务器暂时过载或维护。',
	504: '网关超时。',
};

/**
 * 异常处理程序
 */
const errorHandler = error => {
	//关闭loading
	if (error.response) {
		// 请求已发送但服务端返回状态码非 2xx 的响应
		Notification.error({
			title: `请求错误 ${error.response.status}`,
			message: codeMessage[Number(error.response.status)],
		});

		// switch (error.response.status) {
		// 	case 302:
		// 	case 401:
		// 		MessageBox.confirm('当前登录状态已过期，是否重新登录？', {
		// 			confirmButtonText: '重新登录',
		// 			cancelButtonText: '取消',
		// 			tyle: 'warning',
		// 		})
		// 			.then(() => {
		// 				// window.g_app._store.dispatch({
		// 				// 	type: 'user/loginOut',
		// 				// });
		// 				this.$message({
		// 					type: 'success',
		// 					message: '重新登录成功!',
		// 				});
		// 			})
		// 			.catch(() => {});
		// 		break;
		// 	default:
		// 		break;
		// }
	} else {
		// 请求初始化时出错或者没有响应返回的异常
		Notification.error({
			title: `请求错误`,
			message: '服务器没有做出正确的响应',
		});
	}
	throw error; // 如果throw. 错误将继续抛出.
};

/**
 * 配置http请求时的默认参数
 */
const httpRequest = extend({
	//最大缓存个数, 超出后会自动清掉按时间最开始的一个
	maxCache: 10,
	prefix: '/api',
	errorHandler, // 默认错误处理,
	throwErrIfParseFail: true,
});

// request拦截器
httpRequest.interceptors.request.use(async (url, options) => {
	//每次请求发起之前显示loadding
	Loading.INS = Loading.service({
		text: 'loading...',
		background: 'rgba(0,0,0,.3)',
	});
	const access_token = localStorage.getItem('access_token');
	options.headers['content-type'] = 'application/json;charset=UTF-8';
	if (access_token) {
		options.headers['Authorization'] = 'Bearer ' + access_token;
	}

	return {
		url,
		options,
	};
});

// response拦截器, 处理response
httpRequest.interceptors.response.use(async response => {
	const data = await response.clone().json();
	if (!data) {
		Notification.error({
			title: `请求错误`,
			message: '系统发生了未知错误，请联系管理员',
		});
	} else if (data.code !== 200) {
		Notification.error({
			title: `操作失败`,
			message: data.message,
		});
	}

	//每次响应回来之后立即隐藏loadding
	Loading.INS.close();
	return response;
}, errorHandler);

export default httpRequest;
